package com.dexter.mockclientsdk.cilent;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.dexter.mockclientsdk.model.User;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import static com.dexter.mockclientsdk.utils.SignUtils.genSign;

/**
 * 调用第三方接口的客户端【给接口提供的三个方法发送请求】
 */
public class MockApiClient {
    private String accessKey;
    private String secretKey;

    public MockApiClient(String accessKey, String secretKey) {
        this.accessKey = accessKey;
        this.secretKey = secretKey;
    }

    /**
     * 通过GET方法调用接口
     *
     * @param name
     * @return
     */
    public String getNameByGet(String name) {
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        // 通过HttpUtil工具发送GET请求
        return HttpUtil.get("http://localhost:8123/api/name/", paramMap);
    }


    /**
     * 通过POST方法调用接口
     *
     * @param name
     * @return
     */
    public String getNameByPost(String name) {
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        // 通过HttpUtil工具发送POST请求
        return HttpUtil.post("http://localhost:8123/api/name/", paramMap);
    }


    /**
     * 通过POST方法【向服务器发送User对象】调用接口
     *
     * @param user
     * @return
     */
    public String getUserNameByPost(User user) {
        // 将User对象转换为JSON字符串
        String json = JSONUtil.toJsonStr(user);
        HttpResponse httpResponse = HttpRequest.post("http://localhost:8123/api/name/user/")
                // 构造请求头
                .addHeaders(getHeaderMap(json))
                .body(json)
                .execute();
        // 获取响应结果
        System.out.println(httpResponse.getStatus());
        return httpResponse.body();
    }

    /**
     * 构造请求头
     *
     * @param body User对象转JSON字符串
     * @return
     */
    private Map<String, String> getHeaderMap(String body) {
        Map<String, String> hashMap = new HashMap<>();
//        hashMap.put("Content-Type", "application/json");
        hashMap.put("accessKey", accessKey);
        // 随机生成4位随机数
        hashMap.put("nonce", RandomUtil.randomNumbers(4));
        // 获取当前时间戳
        hashMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        // 请求体内容
        // 解决中文乱码问题
        String encode = "";
        try {
            encode = URLEncoder.encode(body, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        hashMap.put("body", encode);
        // 生成签名
        hashMap.put("sign", genSign(encode, secretKey));
        return hashMap;
    }
}
